---
title: "结构体与联合体"
description: "从 JavaScript 视角学习 C 语言结构体与联合体，理解 struct、union、内存布局，并对比 JS 对象。"
---

# 结构体与联合体

## 1. 概念介绍

### 从 JavaScript 对象到 C 结构体

在 JavaScript 中，对象是动态的键值对集合，属性可以随时添加或删除。而在 C 语言中，结构体（struct）用于将相关变量组合在一起，内存布局固定。联合体（union）允许不同类型的数据共享同一块内存。

> 💡 **核心概念**：C 的结构体和联合体是建模复杂数据、优化内存和系统级编程的基础。

## 2. 语法对比

<UniversalEditor title="结构体与对象对比" compare={true}>
```javascript !! js
// JavaScript - 对象字面量
const person = {
    name: "Alice",
    age: 30,
    isStudent: false
};

// 访问和修改属性
console.log(person.name);
person.age = 31;

// 动态添加属性
person.email = "alice@example.com";

// 嵌套对象
person.address = { city: "北京", zip: "100000" };
```

```c !! c
#include <stdio.h>
#include <string.h>

// 结构体定义
typedef struct {
    char name[50];
    int age;
    int isStudent; // 0 表示否，1 表示是
} Person;

int main() {
    // 声明并初始化结构体
    Person person;
    strcpy(person.name, "Alice");
    person.age = 30;
    person.isStudent = 0;

    // 访问和修改成员
    printf("姓名: %s\n", person.name);
    person.age = 31;

    // C 不支持动态添加属性
    // 嵌套结构体
    struct Address {
        char city[50];
        char zip[10];
    } address = {"北京", "100000"};

    return 0;
}
```
</UniversalEditor>

## 3. 联合体

<UniversalEditor title="联合体" compare={true}>
```javascript !! js
// JavaScript 没有联合体，但变量可随时变类型
let value = 42;
value = "hello";
value = { x: 1 };
```

```c !! c
#include <stdio.h>
#include <string.h>

// 联合体定义
union Data {
    int i;
    float f;
    char str[20];
};

int main() {
    union Data data;
    data.i = 10;
    printf("data.i = %d\n", data.i);
    data.f = 220.5;
    printf("data.f = %f\n", data.f);
    strcpy(data.str, "C语言");
    printf("data.str = %s\n", data.str);
    // 只有最后一次写入的成员是有效的
    return 0;
}
```
</UniversalEditor>

## 4. 常见陷阱
- C 结构体布局固定，不能动态添加属性
- 联合体成员共用内存，只能有效使用一个成员
- 字符串操作需注意缓冲区大小（如用 `strcpy`）
- 内存对齐和填充会影响结构体大小

## 5. 练习题
1. 定义一个 `Book` 结构体，包含书名、作者和价格，编写输入和输出代码。
2. 创建一个联合体，可存储 `int`、`float` 或 `char[10]`，并演示用法。
3. 比较包含相同成员的结构体和联合体的内存占用。

## 6. 性能分析
- 结构体提供高效、缓存友好的数据布局
- 联合体在只需存储一种类型时节省内存
- 不当使用联合体可能导致未定义行为

---

> **小结**：C 的结构体和联合体是数据建模和内存优化的利器。与 JS 对象不同，它们布局固定且需手动管理内存。掌握这些概念对系统编程和高性能开发至关重要。 